﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PortalCurriculo.Domain;
using PortalCurriculo.WebUI.Constants;
using PortalCurriculo.WebUI.Helpers;
using PortalCurriculo.WebUI.UserControls.Basico;
using AcaoSocial = PortalCurriculo.WebUI.UserControls.Curriculo.Visualizacao.AcaoSocial;
using Conhecimento = PortalCurriculo.WebUI.UserControls.Curriculo.Visualizacao.Conhecimento;
using Especializacao = PortalCurriculo.WebUI.UserControls.Curriculo.Especializacao;
using ExperienciaInternacional = PortalCurriculo.WebUI.UserControls.Curriculo.Visualizacao.ExperienciaInternacional;

namespace PortalCurriculo.WebUI.Curriculo
{
    public partial class VisualizarCurriculo : GeneralAccess
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var redirectUrl = ProfissionalLogado != null
                                  ? "~/Curriculo/CadastroCurriculo.aspx"
                                  : "~/Curriculo/Pesquisar.aspx";

            var id = ParseIdQueryString(redirectUrl);
            var curriculo = new Domain.Curriculo().SelectById<Domain.Curriculo>(id);

            if (curriculo == null) Response.Redirect(redirectUrl);

            dadosBasicos.Usuario = curriculo.Profissional.Usuario;
            lblObjetivo.Text = curriculo.Objetivo;

            PreencherIdiomas(curriculo);
            PreencherEspecializacao(FormacaoAcademica, curriculo, Database.IdFormacaoAcademica);
            PreencherEspecializacao(Curso, curriculo, Database.IdCurso);
            PreencherExperienciaProfissional(curriculo);
            PreencherProjetoDesenvolvido(curriculo);
            PreencherInformacao(curriculo);
            PreencherConhecimentoInformatica(curriculo);
            PreencherAcaoSocial(curriculo);
            PreencherExperienciaInternacional(curriculo);
        }

        private void PreencherExperienciaInternacional(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, ExperienciasInternacionais, curriculo.ExperienciaInternacionals.ToList(), typeof(ExperienciaInternacional),
                                    typeof(UserControls.Curriculo.Cadastro.ExperienciaInternacional));
        }

        private void PreencherConhecimentoInformatica(Domain.Curriculo curriculo)
        {
            var entidades = curriculo.ConhecimentoCurriculoes.Where(
                con => con.Conhecimento.Conhecimento2.IdConhecimentoPai.Equals(Database.IdConhecimentoInformatica)).ToList();

            PreencherDadosCurriculo(curriculo, ConhecimentosInformatica, entidades, typeof(Conhecimento),
                                    typeof(UserControls.Curriculo.Cadastro.Conhecimento));
        }

        private void PreencherAcaoSocial(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, AcoesSociais, curriculo.AcaoSocials.ToList(), typeof(AcaoSocial),
                                    typeof(UserControls.Curriculo.Cadastro.AcaoSocial));
        }

        private void PreencherInformacao(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, Informacoes, curriculo.InformacaoCurriculoes.ToList(),
                                    typeof (UserControls.Curriculo.Visualizacao.Informacao),
                                    typeof (UserControls.Curriculo.Cadastro.Informacao));
        }

        private void PreencherDadosCurriculo(Domain.Curriculo curriculo,
                                             UserControls.Curriculo.Curriculo curriculoControle)
        {
            curriculoControle.IdCurriculo = curriculo.Id;
            curriculoControle.IdUsuario = curriculo.Profissional.IdUsuario;
        }

        private void PreencherDadosCurriculo(Domain.Curriculo curriculo, Tela curriculoControle,
                                             IList entidades, Type tipoVisualizacao, Type tipoCadastro) 
        {
            curriculoControle.IdCurriculo = curriculo.Id;
            curriculoControle.IdUsuario = curriculo.Profissional.IdUsuario;
            curriculoControle.Entidades = entidades;
            curriculoControle.TipoUserControlVisualizacao = tipoVisualizacao;
            curriculoControle.TipoUserControlCadastro = tipoCadastro;
        }

        private void PreencherProjetoDesenvolvido(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, ProjetosDesenvolvidos, curriculo.ProjetoDesenvolvidoes.ToList(),
                                    typeof (UserControls.Curriculo.Visualizacao.ProjetoDesenvolvido),
                                    typeof (UserControls.Curriculo.Cadastro.ProjetoDesenvolvido));
        }

        private void PreencherExperienciaProfissional(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, Experiencia, curriculo.ExperienciaProfissionals.ToList(),
                                    typeof (UserControls.Curriculo.Visualizacao.ExperienciaProfissional),
                                    typeof (UserControls.Curriculo.Cadastro.ExperienciaProfissional));
        }

        private void PreencherIdiomas(Domain.Curriculo curriculo)
        {
            PreencherDadosCurriculo(curriculo, Idioma, curriculo.IdiomaCurriculoes.ToList(),
                                    typeof (UserControls.Curriculo.Visualizacao.Idioma),
                                    typeof (UserControls.Curriculo.Cadastro.Idioma));
        }

        private void PreencherEspecializacao(Especializacao especializacao, Domain.Curriculo curriculo,
                                             int idTipoEspecializacao)
        {
            PreencherDadosCurriculo(curriculo, especializacao);
            especializacao.TipoEspecializacao =
                new TipoEspecializacao().SelectById<TipoEspecializacao>(idTipoEspecializacao);
            especializacao.Especializacoes = SelecionarEspecializacao(curriculo, idTipoEspecializacao);
        }

        private List<Domain.Especializacao> SelecionarEspecializacao(Domain.Curriculo curriculo, int idEspecializacao)
        {
            return curriculo.Especializacaos.Where(esp => esp.IdTipoEspecializacao.Equals(idEspecializacao)).
                OrderByDescending(esp => esp.DataInicio).ToList();
        }
    }
}